package com.example.mybatisplus.web.controller;

import com.example.mybatisplus.model.domain.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.example.mybatisplus.common.JsonResponse;
import com.example.mybatisplus.service.MovieService;
import com.example.mybatisplus.model.domain.Movie;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import bigmodel.BigModelNew;

/**
 *
 *  前端控制器
 *
 *
 * @author fmx
 * @since 2024-11-17
 * @version v1.0
 */


@RestController
@RequestMapping("/api/movie")
public class MovieController {

    private final Logger logger = LoggerFactory.getLogger( MovieController.class );
    //??
    @Autowired
    private MovieService movieService;

    /**
    * 描述：根据Id 查询
    *
    */
    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    @ResponseBody
    public JsonResponse getById(@PathVariable("id") Long id)throws Exception {
        Movie  movie =  movieService.getById(id);
        return JsonResponse.success(movie);
    }

    /**
    * 描述：根据Id删除
    *
    */
    @RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
    @ResponseBody
    public JsonResponse deleteById(@PathVariable("id") Long id) throws Exception {
        movieService.removeById(id);
        return JsonResponse.success(null);
    }


    /**
    * 描述：根据Id 更新
    *
    */
    @RequestMapping(value = "", method = RequestMethod.PUT)
    @ResponseBody
    public JsonResponse updateMovie(Movie  movie) throws Exception {
        movieService.updateById(movie);
        return JsonResponse.success(null);
    }


    /**
    * 描述:创建Movie
    *
    */
    @RequestMapping(value = "", method = RequestMethod.POST)
    @ResponseBody
    public JsonResponse create(Movie  movie) throws Exception {
        movieService.save(movie);
        return JsonResponse.success(null);
    }

    //可以用post请求添加电影，返回boolean值作为电影是否成功添加的依据
    /**
     * 描述:添加Movie
     *
     */
    @PostMapping("addMovie")
    public Movie addMovie(@RequestBody Movie movie) {
        return movieService.addmovie(movie);
    }

    //通过id查询电影
    /**
     * 描述:通过ID查询Movie
     *
     */
    @GetMapping("/{movieId}")
    public Movie getMovieById(@PathVariable Integer movieId) {
        return movieService.getById(movieId);
    }

    // 前端api文件内容示例export const getAnswer = question => http.GET('/api/movie/ordinaryQA?question=' + question)

    //大模型问答需要有两个接口（基于上次集中开发讨论得到）

    /**
     * 描述:传入问题，返回AI的回答
     *
     */
//    @GetMapping({"ordinaryQA", "getAnswer"})
    @GetMapping({"QA"})
    public JsonResponse getAnswer(String question) throws Exception {
        BigModelNew.singleAnswerTemp="不好意思，刚才短暂失联啦，可以换一个问题吗？";
        String add= "你现在是一个电影专家，只能回答我电影相关的问题，如果我问你与电影无关的问题，比如食物、天气、出行计划、日期，你必须拒绝回答我。任何与电影无关的问题，都必须拒绝回答我，回答不必按照任何格式，一句话即可，但是回答要在100字以内，我的问题是：";
        //输入回答
        BigModelNew.NewQuestion = add+question;
        System.out.println(BigModelNew.NewQuestion);
        BigModelNew.chatAI();
        Thread.sleep(7000);
        String ans = BigModelNew.singleAnswerTemp;
        return JsonResponse.success(ans);
    }
    /**
     * 描述:传入问题，返回一个 movie实例
     *
     */
    @GetMapping("movieQA")
    public JsonResponse getMovieFromAnswer(String question) throws Exception{
        BigModelNew.singleAnswerTemp="不好意思，刚才短暂失联啦，可以换一个问题吗？";
        String add= "你现在是一个电影专家，只能回答我电影相关的问题，如果我问你与电影无关的问题，比如食物、天气、出行计划、日期，你必须拒绝回答我。我将给你提供一个电影的名字，" +
        "你要按照我要求的格式给出电影相关信息，注意一次只能给一个电影的相关信息，并且不要输出其他语句，给出的电影信息格式如下,务必按照格式输出，打全格式：" +
        "{电影名：导演：类型：国家：语言：上映时间：主演：详情：}";
        BigModelNew.NewQuestion = add+question;
        BigModelNew.chatAI();
        Thread.sleep(10000);
        //BigModelNew bigModelNew = new BigModelNew();
        String movieAnswer = BigModelNew.singleAnswerTemp;// 假设大模型包装方法是fromQtoA()，形参String，返回值String
        //把movieAnswer分割成9个String变量
        // 去除首尾的括号和换行符
        movieAnswer = movieAnswer.trim().substring(1, movieAnswer.length() - 1).replace("\n", " ");// 提取电影名称
        if(!(movieAnswer.contains("详情：")&&movieAnswer.contains("电影名：")&&movieAnswer.contains("类型：")&&movieAnswer.contains("国家：")&&movieAnswer.contains("语言：")&&movieAnswer.contains("上映时间：")&&movieAnswer.contains("主演：")&&movieAnswer.contains("导演："))){
            System.out.println(1);
            return JsonResponse.success(false);
        }
        else {
            String movieName = movieAnswer.substring(movieAnswer.indexOf("电影名：") + 4, movieAnswer.indexOf(" 导演："));// 提取导演名称
            String movieDirector = movieAnswer.substring(movieAnswer.indexOf("导演：") + 3, movieAnswer.indexOf(" 类型："));// 提取电影类型
            String movieType = movieAnswer.substring(movieAnswer.indexOf("类型：") + 3, movieAnswer.indexOf(" 国家："));// 提取电影国家
            String movieNation = movieAnswer.substring(movieAnswer.indexOf("国家：") + 3, movieAnswer.indexOf(" 语言："));// 提取电影语言
            String movieLanguage = movieAnswer.substring(movieAnswer.indexOf("语言：") + 3, movieAnswer.indexOf(" 上映时间："));// 提取上映时间
            String movieRelease = movieAnswer.substring(movieAnswer.indexOf("上映时间：") + 5, movieAnswer.indexOf(" 主演："));// 提取主演
            String movieCast = movieAnswer.substring(movieAnswer.indexOf("主演：") + 3, movieAnswer.indexOf(" 详情："));// 提取电影详情
            String movieReview = movieAnswer.substring(movieAnswer.indexOf("详情：") + 3);// 电影海报设为空（假设没有提供）
            String moviePoster = "";
            Movie movie = new Movie(movieName, movieDirector, movieType, movieNation, movieLanguage, movieRelease, movieCast, movieReview, moviePoster);
            //{电影名：电影导演：电影类型：电影国家：电影语言：电影上映时间：主演：电影详情：}
            movie=movieService.addmovie(movie);// 这一步是insert到movie表
            return JsonResponse.success(movie);// 这是返回Movie类实例
        }
    }
    @GetMapping("rankMovie")
    public JsonResponse rankMovie(Integer type){
        List<Integer> collectedMovieIds=new ArrayList<>();
        if(type==1){
            collectedMovieIds.add(1);
            collectedMovieIds.add(2);
            collectedMovieIds.add(19);
            collectedMovieIds.add(3);
        }
        if(type==2){
            collectedMovieIds.add(1);
            collectedMovieIds.add(7);
            collectedMovieIds.add(5);
            collectedMovieIds.add(3);
        }
        if(type==3){
            int array[]=new int[4];
            getNumber(array);
            for (int i=0;i<array.length;i++){
                collectedMovieIds.add(array[i]);
            }
        }
        return JsonResponse.success(movieService.getMoviesByIds(collectedMovieIds));
    }

    public static int randomNumber(){    //返回随机数1-30
        Random random=new Random();
        return random.nextInt(100)+1;
    }
    public static void compareNum(int j,int num,int arr[]){   //产生不同的数
        for(int i=0;i<arr.length;i++){    //循环数组
            if (num==arr[i] && i!=j){    //判断是否与数组中的某个数相同
                num=randomNumber();    //相同就重新产生随机数
                arr[j]=num;    //将原来数组中重复的数，替换为新产生的随机数
                compareNum(j,num,arr);    //调用自身，再次判断
            }

        }
    }
    public static void getNumber(int array[]){   //获取四个数
        for (int i=0;i<array.length;i++){    //循环数组
            array[i]=randomNumber();    //在相应的位置上产生随机数
            if (i>=1){    //判断数组中是否含有两个数及以上
                compareNum(i,array[i],array);    //输入参数，当前的位置数，整个数组
            }
        }
    }


}

